#include "stdio.h"
#include "malloc.h"
#include "Element.h"
#include "LinkedStack.h"

/**
 * 初始化链栈
 * @param linkedStack
 */
void InitLinkedStack(LinkedStack *linkedStack) {
    linkedStack->top = NULL;
    linkedStack->length = 0;
}


/**
 * 压栈并返回结果
 * @param linkedStack
 * @param element
 * @return 返回 TRUE | FALSE
 */
int PushLinkedStack(LinkedStack *linkedStack, ElementType element) {
    /* 创建一个新节点 */
    StackNode *newNode = (StackNode *) malloc(sizeof(StackNode));
    newNode->data = element;
    /* 新节点的 next 指向当前的栈顶 */
    newNode->next = linkedStack->top;
    linkedStack->top = newNode;
    linkedStack->length++;

    return TRUE;
}


/**
 *
 * @param linkedStack
 * @param element
 * @return 返回 TRUE | FALSE
 */
int PopLinkedStack(LinkedStack *linkedStack, ElementType *element) {
    /* 判断是否为空 */
    if (linkedStack->top == NULL) {
        printf("空栈,出栈操作失败!\n");
        return FALSE;
    }
    /* 返回栈顶元素 */
    *element = linkedStack->top->data;
    /* 记录出栈操作前的栈顶指针 */
    StackNode *node = linkedStack->top;
    /* 栈顶指针下移一位 */
    linkedStack->top = linkedStack->top->next;
    /* 释放原空间 */
    free(node);
    linkedStack->length--;
    return TRUE;
}

/**
 * 清空栈
 * @param linkedStack
 */
void ClearLinkedStack(LinkedStack *linkedStack) {
    StackNode *tempNode;
    while (linkedStack->top) {
        tempNode = linkedStack->top;
        /* 栈顶指向下一个元素 */
        linkedStack->top = linkedStack->top->next;
        free(tempNode);
        linkedStack->length--;
    }
}

/**
 * 销毁栈
 * @param linkedStack
 */
void DestroyLinkedStack(LinkedStack *linkedStack) {
    /* 先清空栈 */
    ClearLinkedStack(linkedStack);
    free(linkedStack);
    linkedStack = NULL;
}

int test(int n) {
   
}